/**
 * Generali Solutions d'assurances - Tous droits réservés &copy; 2007 - 2010
 */
package fr.generali.accueilclient.client.services.impl;

import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.core.convert.converter.Converter;
import org.springframework.stereotype.Service;

import fr.generali.accueilclient.client.assembler.input.VisibiliteBuilderS10NonQualifie;
import fr.generali.accueilclient.client.om.IClientRecherche;
import fr.generali.accueilclient.client.om.IPersonne;
import fr.generali.accueilclient.client.services.IRechercheClientService;
import fr.generali.accueilclient.commun.exception.AccueilClientBusinessException;
import fr.generali.refservcommuns.clients.resume.dto.v3.contextevisibilite.ContexteVisibilite;
import fr.generali.refservcommuns.rce.consultpersonnecontact.ConsulterPersonneContact;
import fr.generali.refservcommuns.rce.consultpersonnecontact.ConsulterPersonneContactResponse;
import fr.generali.refservcommuns.rce.consultpersonnecontact.services.IConsultationPersonneContactWebService;
import fr.generali.refservcommuns.rce.recherche.nonqualifie.dossier.identifiant.DossierRechercheParIdentifiant;
import fr.generali.refservcommuns.rce.recherche.nonqualifie.dtosearchbyid.DtoSearchById;
import fr.generali.refservcommuns.rce.recherche.nonqualifie.services.IRechercheParIdNonQualifieWebService;
import fr.generali.refservcommuns.rce.recherche.nonqualifie.services.ResumeWSBusinessException;
import fr.generali.refservcommuns.rce.recherche.nonqualifie.services.TechnicalFault;
import fr.generali.refservcommuns.rce.searchgenerique.recherchepersonnegeneriqueservice.RechercherPersonnesGenerique;
import fr.generali.refservcommuns.rce.searchgenerique.recherchepersonnegeneriqueservice.RechercherPersonnesGeneriqueResponse;
import fr.generali.refservcommuns.rce.searchgenerique.services.IRecherchePersonneGeneriqueWebService;

/**
 * Implémentation de {@link IRechercheClientService}
 * 
 * @author selrhazala
 */
@Service
public class RechercheClientService implements IRechercheClientService {

    /**
     * LOGGER
     */
    private static final Logger LOGGER = LoggerFactory.getLogger(ClientService.class);

    /**
     * Service de recherche personnes générique.
     */
    @Autowired
    @Qualifier("P2bis")
    private IRecherchePersonneGeneriqueWebService p2bis;

    /**
     * Service de lecture personne RCE incluant les données de contact.
     */
    @Autowired
    @Qualifier("P42")
    private IConsultationPersonneContactWebService p42;

    /**
     * Service de recherche personnes par identifiant Non Qualifie.
     */
    @Autowired
    @Qualifier("S10NonQualifie")
    private IRechercheParIdNonQualifieWebService s10NonQualifie;

    /**
     * Assembler en entrée de P2bis
     */
    @Autowired
    @Qualifier("clientRecherche2RechercherPersonnesGeneriqueConverter")
    private Converter<IClientRecherche, RechercherPersonnesGenerique> clientRecherche2RechercherPersonnesGeneriqueConverter;

    /**
     * Assembler en entrée de P42 pour un numéro de client agent / courtier
     */
    @Autowired
    @Qualifier("clientRecherche2ConsulterPersonneContactConverter")
    private Converter<IClientRecherche, ConsulterPersonneContact> clientRecherche2ConsulterPersonneContactConverter;

    /**
     * Assembler en entrée de S10
     */
    @Autowired
    @Qualifier("clientRecherche2DtoSearchByIdConverter")
    private Converter<IClientRecherche, DtoSearchById> clientRecherche2DtoSearchByIdConverter;

    /**
     * Assembler en entrée de S10NonQualifie
     */
    @Autowired
    @Qualifier("visibiliteBuilderS10NonQualifie")
    private VisibiliteBuilderS10NonQualifie visibiliteBuilderS10NonQualifie;

    /**
     * Classe permettant de mapper les résultats des appels aux webservices
     */
    @Autowired
    private ClientServiceMapper clientServiceMapper;

    /**
     * {@inheritDoc}
     */
    public List<IPersonne> rechercherClientGenerique(IClientRecherche criteres) throws AccueilClientBusinessException {
        List<IPersonne> clients = null;

        try {
            RechercherPersonnesGenerique request =
                            clientRecherche2RechercherPersonnesGeneriqueConverter.convert(criteres);
            RechercherPersonnesGeneriqueResponse response = p2bis.rechercherPersonnesGenerique(request);
            clients = clientServiceMapper.mapperRechercheClientGenerique(response);
        } catch (fr.generali.refservcommuns.rce.searchgenerique.services.TechnicalFault e) {
            // Pas d'exception jetée ici car la recherche lance une exception
            // quand 0 client trouvé
            LOGGER.debug(e.getMessage());
        } catch (fr.generali.refservcommuns.rce.searchgenerique.services.WsRceBusinessException e) {
            // Pas d'exception jetée ici car la recherche lance une exception
            // quand 0 client trouvé
            LOGGER.debug(e.getMessage());
        }

        return clients;
    }

    /**
     * {@inheritDoc}
     */
    public List<IPersonne> rechercherClientParIdNonQualifie(IClientRecherche criteres)
                    throws AccueilClientBusinessException {
        List<IPersonne> clients = null;

        try {
            DtoSearchById request = clientRecherche2DtoSearchByIdConverter.convert(criteres);
            ContexteVisibilite visibilite =
                            visibiliteBuilderS10NonQualifie.buildVisibiliteS10NonQualifie(criteres.getUserInfo(),
                                            criteres.getListeCodeIntermediaire());
            DossierRechercheParIdentifiant response =
                            s10NonQualifie.rechercheParIdentifiantNonQualifie(request, null, visibilite);
            clients = clientServiceMapper.mapperRechercheClientParIdNonQuailifie(response);
        } catch (ResumeWSBusinessException e) {
            LOGGER.debug("Erreur business :\n" + e.getMessage());
            throw new AccueilClientBusinessException(e.getMessage(), e);
        } catch (TechnicalFault e) {
            LOGGER.debug("Erreur business :\n" + e.getMessage());
            throw new AccueilClientBusinessException(e.getMessage(), e);
        }

        return clients;
    }

    /**
     * {@inheritDoc}
     */
    public List<IPersonne> rechercherClientParNumeroClientAgent(IClientRecherche criteres)
                    throws AccueilClientBusinessException {
        List<IPersonne> clients = null;
        ConsulterPersonneContactResponse resp = null;

        try {
            ConsulterPersonneContact req = clientRecherche2ConsulterPersonneContactConverter.convert(criteres);
            resp = p42.consulterPersonneContact(req);
            clients = clientServiceMapper.mapperRechercheClientParNumeroClientAgent(resp);
        } catch (fr.generali.refservcommuns.rce.consultpersonnecontact.services.TechnicalFault e) {
            // Pas d'exception jetée ici car la recherche lance une exception
            // quand 0 client trouvé
            LOGGER.debug(e.getMessage());
        } catch (fr.generali.refservcommuns.rce.consultpersonnecontact.services.WsRceBusinessException e) {
            // Pas d'exception jetée ici car la recherche lance une exception
            // quand 0 client trouvé
            LOGGER.debug(e.getMessage());
        }

        return clients;
    }

}
